import jwt
from jwt import PyJWKError, PyJWTError
from datetime import datetime,timedelta
from comment.utils import const
from flask import current_app
from comment.modules.user import User

def generate_tokens(uid):
    """
    一个用户在一次回话中生成一个token
    :param uid:
    :return:
    """
    params = {
        'id': uid,
        # exp 代表token的有效时间
        'exp': datetime.utcnow() + timedelta(seconds=const.JWT_EXPIRY_SECOND)
    }
    # 参数2： 秘钥， 参数3： 算法
    # SHA-256 : 密码散列函数算法。 256bit长的哈希值（32个数组）---->十六进制字符串来表示。64。 信息摘要。不可逆
    return jwt.encode(payload=params, key=const.SECRET_KEY, algorithm='HS256')  # 算法是：SHA-256


def verify_tokens(token_str):
    """
    验证token，如果验证成功，返回用户ID
    :param token_str:
    :return:
    """
    try:
        # 返回之前生产token的时候的字典
        data = jwt.decode(token_str, key=const.SECRET_KEY, algorithms='HS256')
        current_app.logger.info(data)
        user = User.query.filter(User.id == data['id']).first()
        if user and user.onlock == 0: # 当前用户的状态正常
            return {'id': user.id}
        else:
            return {'message': '数据库中不存在当前用户，或者用户已经过期'}
    except PyJWTError as e:
        current_app.logger.error(e)
        return {'message': 'token 验证识别'}